<?php
/**
 * 功能：接收转发请求，替换域名后通过 curl 代理请求，返回目标响应
 * 接收参数：url（通过 Requestly 拼接在查询参数中，如 ?url=/ysapi/applyRefund）
 * 域名替换规则：将原域名 dev002.gxyushengwenhua.com 替换为目标域名（示例中为 ys.yangjc.com，可根据实际需求修改）
 */

// 1. 基础配置：定义域名替换规则（根据你的实际目标域名修改）
$originalDomain = 'dev002.gxyushengwenhua.com'; // 前端转发的原域名
$targetDomain = 'ys.yangjc.com';               // 最终要请求的目标域名
$targetScheme = 'https';                       // 目标域名的协议（http/https，根据实际情况修改）

// 2. 提取前端传递的原始接口路径（从查询参数 ?url=xxx 中获取）
$requestPath = $_GET['url'] ?? '';
if (empty($requestPath)) {
    http_response_code(400);
    echo json_encode(['error' => '缺少必要参数：url（需通过 ?url=接口路径 传递）']);
    exit;
}

// 3. 构造目标请求 URL（替换域名 + 拼接路径）
$requestPath.=(preg_match("/\?/",$requestPath)?'&':'?')."XDEBUG_SESSION_START=58542";
$targetUrl = "{$targetScheme}://{$targetDomain}".$requestPath;

// 4. 提取前端原始请求的 Headers（排除 curl 不需要的冗余头，透传关键头）
$requestHeaders = [];
foreach ($_SERVER as $key => $value) {
    // 筛选 HTTP 请求头（PHP 中 $_SERVER 里的头信息以 HTTP_ 开头）
    if (strpos($key, 'HTTP_') === 0) {
        // 转换为标准头格式（如 HTTP_USER_AGENT → User-Agent）
        $headerName = str_replace('HTTP_', '', $key);
        $headerName = str_replace('_', '-', $headerName);
        $headerName = ucwords(strtolower($headerName), '-');

        // 排除不需要透传的头（避免影响目标服务器识别）
        $excludeHeaders = ['Host', 'Content-Length']; // Host 需用目标域名，Content-Length 由 curl 自动处理
        if (!in_array($headerName, $excludeHeaders)) {
            $requestHeaders[$headerName] = $value;
        }
    }
}
// 强制添加目标域名的 Host 头（确保目标服务器正确识别请求来源）
$requestHeaders['Host'] = $targetDomain;

// 5. 提取前端原始请求的方法（GET/POST/PUT/DELETE 等）和请求体
$requestMethod = $_SERVER['REQUEST_METHOD'];


$requestBody = '';
// 处理非 GET 请求的请求体（如 POST 的表单数据、JSON 数据）
if ($requestMethod !== 'GET' && $requestMethod !== 'HEAD') {
    $requestBody = file_get_contents('php://input');
}

$browserCookie = $_SERVER['HTTP_COOKIE'] ?? '';
$browserCookie .= ($browserCookie ? '; ' : '') . 'XDEBUG_SESSION=58542';  // 追加 XDEBUG_SESSION  Cookie让目标服务器识别调试会话，能够触发 Xdebug 调试

// 6. 初始化 curl，配置代理请求参数
$ch = curl_init();
curl_setopt_array($ch, [
    // 目标请求 URL
    CURLOPT_URL => $targetUrl,
    // 保留响应头信息（后续需要透传给前端）
    CURLOPT_HEADER => true,
    // 返回响应内容（而非直接输出）
    CURLOPT_RETURNTRANSFER => true,
    // 跟随目标服务器的重定向（如 301/302）
    CURLOPT_FOLLOWLOCATION => true,
    // 设置请求方法
    CURLOPT_CUSTOMREQUEST => $requestMethod,
    // 透传请求体（非 GET 请求时）
    CURLOPT_POSTFIELDS => $requestBody,
    // 超时时间（避免请求卡住，单位：秒）
    CURLOPT_TIMEOUT => 30,
    CURLOPT_ENCODING => '',
    // 忽略 SSL 证书验证（仅用于测试环境！生产环境需删除此配置并配置合法证书）
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_COOKIE => $browserCookie,
]);

// 7. 配置 curl 请求头（将提取的前端头信息传入）
$curlHeaders = [];

foreach ($requestHeaders as $name => $value) {
    if($name=="Origin"){
        $value = "https://ys.yangjc.com";
    }
    $curlHeaders[] = "{$name}: {$value}";
}

curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
//print_r($curlHeaders);exit;
// 8. 执行 curl 请求，获取响应（包含响应头 + 响应体）
$response = curl_exec($ch);



// 9. 处理 curl 错误（如网络超时、目标服务器不可达）
if (curl_errno($ch)) {
    $errorMsg = curl_error($ch);
    curl_close($ch);
    http_response_code(500);
    echo json_encode(['error' => 'curl 请求失败：' . $errorMsg]);
    exit;
}

// 10. 拆分响应头和响应体（curl 返回的内容中，头和体用 "\r\n\r\n" 分隔）
$responseParts = explode("\r\n\r\n", $response, 2);
$responseHeadersStr = $responseParts[0]; // 响应头字符串
$responseBody = $responseParts[1] ?? '';  // 响应体（可能为空，如 HEAD 请求）

// 11. 解析响应头，透传给前端（排除 curl 冗余头，保留目标服务器返回的头）
$responseHeaders = [];
$headerLines = explode("\r\n", $responseHeadersStr);


foreach ($headerLines as $line) {
    // 跳过状态行（如 HTTP/1.1 200 OK），PHP 会自动处理状态码
    if (strpos($line, 'HTTP/') === 0) {
        // 提取状态码（如 200、404）并设置前端响应状态码
        preg_match('/HTTP\/\d+\.\d+ (\d+)/', $line, $matches);
        if (isset($matches[1])) {
            http_response_code((int)$matches[1]);
        }
        continue;
    }
    // 解析键值对格式的响应头（如 Content-Type: application/json）
    $colonPos = strpos($line, ':');
    if ($colonPos !== false) {
        $headerName = trim(substr($line, 0, $colonPos));
        $headerValue = trim(substr($line, $colonPos + 1));
        // 排除不需要透传的头（如 Connection，由 Web 服务器自动处理）
        if ($headerName !== 'Connection') {
            //header("{$headerName}: {$headerValue}", true); // true 表示覆盖同名头
        }
    }
}

$str="";
$method = strtoupper($requestMethod);
$query = parse_url($targetUrl,PHP_URL_QUERY);   // 可能带 ?XDEBUG_SESSION_START=58542
$uri   = parse_url($targetUrl,PHP_URL_PATH) . ($query ? "?$query" : "");
$str.="$method $uri HTTP/1.1\n";

// 12. 输出响应体（返回目标服务器的原始响应内容）

foreach ($curlHeaders as $h) $str.="$h\n";
if ($requestBody !== '') $str.="\n$requestBody\n\n\n\n";
$curlCmd = "curl -X {$method}";
$curlCmd .= " -H " . escapeshellarg('Accept-Encoding: identity');
foreach ($curlHeaders as $h) {
    $curlCmd .= " -H " . escapeshellarg($h);
}
if ($requestBody !== '') {
    $curlCmd .= " -d " . escapeshellarg($requestBody);
}
$curlCmd .= " " . escapeshellarg($targetUrl);

$responseBody = json_decode($responseBody, true) ?: [];   // 兼容非 JSON 响应
$responseBody['curl_cmd'] = $curlCmd;

$responseBody['header'] = $str;
echo json_encode($responseBody);


// 13. 关闭 curl 资源
curl_close($ch);

